package org.javahispano.javacup.modelo;

/**Comando que especifica de que forma se rematara el balon*/
public final class ComandoGolpearBalon extends Comando {

    private int indJugador;
    private Posicion destinoBola = new Posicion();
    private double anguloRemate = 0;
    private double fuerzaRemate = 0;
    private boolean angulo = false;
    private boolean destino = false;
    private double anguloVertical = 0;
    private boolean avanza = false;

    /**retorna true si se especifico como destino un angulo, en vez de una coordenada*/
    public boolean isAngulo() {
        return angulo;
    }

    /**retorna true si se especifico como destino una coordenada, en vez de un angulo*/
    public boolean isCoordenada() {
        return destino;
    }

    /**Retorna el indice del jugador que golpeara el balon*/
    @Override
    public int getIndJugador() {
        return indJugador;
    }

    /**Tipo del comando*/
    @Override
    public Tipo getTipo() {
        return Tipo.GOLPEAR_BOLA;
    }

    /**Retorna el angulo de direccion del remate*/
    public double getAnguloRemate() {
        return anguloRemate;
    }

    /**Retorna la fuerza del remate (de 0 a 1)*/
    public double getFuerzaRemate() {
        return fuerzaRemate;
    }

    /**Retorna el coordenada destino del remate*/
    public Posicion getDestinoBalon() {
        return destinoBola;
    }

    /**Retorna el angulo vertical*/
    public double getAnguloVertical() {
        return anguloVertical;
    }

    /**Indica si el comando esta en modalidad avanzar con el balon*/
    public boolean esAvanzarConBalon() {
        return avanza;
    }

    /**Corresponde a el comando avanzar con el balon, se indica el indice del juagador que avanzara con el balon*/
    public ComandoGolpearBalon(int indJugador) {
        this.indJugador = indJugador;
        this.avanza = true;
    }

    /**Instancia el comando golpear balon, indicando: el indice del jugador que rematara,
     * las coordenadas de destino, la fuerza del remate (entre 0 y 1) y si es por alto, el remate por alto
    es con angulo Constantes.ANGULO_VERTICAL */
    public ComandoGolpearBalon(int indJugador, Posicion destinoBola, double fuerzaRemate, boolean remateAlto) {
        this.indJugador = indJugador;
        this.destinoBola = new Posicion(destinoBola);
        if (fuerzaRemate > 1) {
            fuerzaRemate = 1;
        }
        if (fuerzaRemate < 0) {
            fuerzaRemate = 0;
        }
        this.fuerzaRemate = fuerzaRemate;
        this.anguloVertical = remateAlto ? Constantes.ANGULO_VERTICAL : 0;
        this.destino = true;
        this.angulo = false;
    }

    /**Instancia el comando golpear balon, indicando: el indice del jugador que rematara,
     * las coordenadas de destino, la fuerza del remate (entre 0 y 1) y el angulo vertical, el angulo vertical debe estar entre
    0 y Constantes.ANGULO_VERTICAL_MAX */
    public ComandoGolpearBalon(int indJugador, Posicion destinoBola, double fuerzaRemate, double anguloVertical) {
        this.indJugador = indJugador;
        this.destinoBola = new Posicion(destinoBola);
        if (fuerzaRemate > 1) {
            fuerzaRemate = 1;
        }
        if (fuerzaRemate < 0) {
            fuerzaRemate = 0;
        }
        this.fuerzaRemate = fuerzaRemate;
        if (anguloVertical > Constantes.ANGULO_VERTICAL_MAX) {
            anguloVertical = Constantes.ANGULO_VERTICAL_MAX;
        }
        if (anguloVertical < 0) {
            anguloVertical = 0;
        }
        this.anguloVertical = anguloVertical;
        this.destino = true;
        this.angulo = false;
    }

    /**Instancia el comando golpear balon, indicando: el indice del jugador que rematara,
     * el angulo de destino, la fuerza del remate (entre 0 y 1) y si es por alto, el remate por alto
    es con angulo Constantes.ANGULO_VERTICAL */
    public ComandoGolpearBalon(int indJugador, double anguloRemate, double fuerzaRemate, boolean remateAlto) {
        this.indJugador = indJugador;
        this.anguloRemate = anguloRemate;
        if (fuerzaRemate > 1) {
            fuerzaRemate = 1;
        }
        if (fuerzaRemate < 0) {
            fuerzaRemate = 0;
        }
        this.fuerzaRemate = fuerzaRemate;
        this.anguloVertical = remateAlto ? Constantes.ANGULO_VERTICAL : 0;
        this.angulo = true;
        this.destino = false;
    }

    /**Instancia el comando golpear balon, indicando: el indice del jugador que rematara,
     * el angulo de destino, la fuerza del remate (entre 0 y 1) y el angulo vertical, el angulo vertical debe estar entre
    0 y Constantes.ANGULO_VERTICAL_MAX*/
    public ComandoGolpearBalon(int indJugador, double anguloRemate, double fuerzaRemate, double anguloVertical) {
        this.indJugador = indJugador;
        this.indJugador = indJugador;
        this.anguloRemate = anguloRemate;
        if (fuerzaRemate > 1) {
            fuerzaRemate = 1;
        }
        if (fuerzaRemate < 0) {
            fuerzaRemate = 0;
        }
        this.fuerzaRemate = fuerzaRemate;
        if (anguloVertical > Constantes.ANGULO_VERTICAL_MAX) {
            anguloVertical = Constantes.ANGULO_VERTICAL_MAX;
        }
        if (anguloVertical < 0) {
            anguloVertical = 0;
        }
        this.anguloVertical = anguloVertical;
        this.angulo = true;
        this.destino = false;
    }
}
